package com.example.lotterysystem.service.activitystatus.operater;

import com.example.lotterysystem.mapper.ActivityMapper;
import com.example.lotterysystem.mapper.ActivityPrizeMapper;
import com.example.lotterysystem.pojo.dataobject.ActivityDO;
import com.example.lotterysystem.service.dto.ConvertActivityStatusDTO;
import com.example.lotterysystem.service.enums.ActivityPrizeStatusEnum;
import com.example.lotterysystem.service.enums.ActivityStatusEnum;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class ActivityOperator extends AbstractActivityOperator{

    @Autowired
    private ActivityMapper activityMapper;
    @Autowired
    private ActivityPrizeMapper activityPrizeMapper;

    @Override
    public Integer sequence() {
        return 2;
    }

    @Override
    public boolean needConvert(ConvertActivityStatusDTO convertActivityStatusDTO) {
        // 需要根据 活动Id 和 活动状态进行判断
        Long activityId = convertActivityStatusDTO.getActivityId();
        ActivityStatusEnum targetStatus = convertActivityStatusDTO.getTargetActivityStatus();

        // 传来的 活动Id 和 活动状态 是否为空
        if (activityId == null
                || targetStatus == null) {
            return false;
        }

        // 根据活动Id 查询对应的活动信息，如果 查询到的活动信息为空，就是不存在
        ActivityDO activityDO = activityMapper.selectById(activityId);
        if (activityDO == null) {
            return false;
        }

        // 根据查到的活动信息判断 传来的 活动状态(COMPLETED) 是否 和数据库中额的状态一致
        if (activityDO.getStatus()
                .equalsIgnoreCase(targetStatus.name())) {
            return false;
        }

        // 再判断 活动关联奖品表中的 没抽完的奖品个数是否还存在，存在活动就不能结束
        int count =  activityPrizeMapper.countPrize(activityId, ActivityPrizeStatusEnum.INIT.name());
        if (count > 0) {
            return false;
        }

        return true;
    }

    @Override
    public boolean convert(ConvertActivityStatusDTO convertActivityStatusDTO) {
        try {
            Long activityId = convertActivityStatusDTO.getActivityId();
            ActivityStatusEnum targetStatus = convertActivityStatusDTO.getTargetActivityStatus();
            activityMapper.updateStatus(activityId,targetStatus.name());
            return true;
        }catch (Exception e) {
            return false;
        }
    }
}
